// !(function (root, factory) {
//   if (typeof exports == "object" && typeof module != "undefined") {
//     module.exports = factory();
//   } else if (typeof define == "function" && define.amd) {
//     define(factory);
//   } else {
//     // 5+ 兼容
//     document.addEventListener(
//       "plusready",
//       function () {
//         // 修改此处为插件命名
//         var moduleName = "KingonH5Plugin";
//         // 挂载在plus下
//         root.plus[moduleName] = factory();
//       },
//       false
//     );
//   }
// })(this, function () {
//   function createCallback(successCallback, errorCallback) {
//     return {
//       success:
//         typeof successCallback === "function"
//           ? function (args) {
//             successCallback(args);
//           }
//           : null,
//       fail:
//         typeof errorCallback === "function"
//           ? function (code) {
//             errorCallback(code);
//           }
//           : null,
//     };
//   }

//   function execFunction(functionName, Argus, successCallback, errorCallback) {
//     var { success, fail } = createCallback(successCallback, errorCallback);
//     var callbackID = plus.bridge.callbackId(success, fail);
//     return plus.bridge.exec("KingonH5Plugin", functionName, [callbackID, Argus]);
//   }
//   //在此处定义自己的方法
//   var KingonH5Plugin = {
//     /**
//      * 调用SDK 方法
//      * @param {*} name 案例方法名
//      * @param {*} Argus1 案例数据 {"appkey": "", "token":""}
//      * @param {*} successCallback
//      * @param {*} errorCallback
//      * @returns
//      */
//     execFunction: function (name, Argus1, successCallback, errorCallback) {
//       return execFunction(name, Argus1, successCallback, errorCallback);
//     },
//   };
//   return KingonH5Plugin;
// });

function createCallback(successCallback: Function, errorCallback: Function) {
  return {
    success:
      typeof successCallback === "function"
        ? function (args: any) {
            successCallback(args);
          }
        : null,
    fail:
      typeof errorCallback === "function"
        ? function (code: any) {
            errorCallback(code);
          }
        : null,
  };
}

/**
 * 调用SDK 方法
 * @param {*} name 案例方法名
 * @param {*} Argus1 案例数据 {"appkey": "", "token":""}
 * @param {*} successCallback
 * @param {*} errorCallback
 * @returns
 */
export const execFunction = (functionName: string, Argus: any, successCallback: Function, errorCallback: Function) => {
  if (!Argus) Argus = "{}";
  if (typeof Argus !== "string") Argus = JSON.stringify(Argus);
  const { success, fail } = createCallback(successCallback, errorCallback);
  const callbackID = plus.bridge.callbackId(success, fail);
  return plus.bridge.exec("KingonH5Plugin", functionName, [callbackID, Argus]);
};

/** * 调用SDK 方法 等待*/
export const asyncExecFunction = (functionName: string, Argus?: any) => {
  // #ifdef H5
  // 方便h5端开发调试使用
  if (process.env.NODE_ENV == "development") {
    if (functionName == "HnXfjPortInit" && window.__dev__card) {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve(JSON.stringify({ Action: "OnCardreaded", CardNumb: window.__dev__card }));
        }, 1000);
      });
    }
    // if (functionName == "HnXfjGetSN" && window.__dev__deviceId) {
    //   return new Promise((resolve, reject) => {
    //     setTimeout(() => {
    //       resolve(window.__dev__deviceId);
    //     }, 1000);
    //   });
    // }
  }

  // #endif

  return new Promise((resolve, reject) => {
    if (!Argus) Argus = "{}";
    if (typeof Argus !== "string") Argus = JSON.stringify(Argus);
    execFunction(functionName, Argus, resolve, reject);
  });
};

const KingonH5Plugin = {
  execFunction,
  asyncExecFunction,
};
export default KingonH5Plugin;
